package rootdb

import (
	"fmt"

	"gitee.com/xgotool/sqlite-logs-more/model"
	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

type ids struct {
	MinId int64 `gorm:"column:min_id"`
	MaxId int64 `gorm:"column:max_id"`
}

// 处理文件的最大ID和最小ID，便于后续的搜索
//
//	file	文件路径【需要为sqlite的日志文件，而非root入口文件】
func SqliteMaxMin(file string) (min, max int64) {
	// 判断文件是否为root文件
	if file == _default.RootPath {
		fmt.Println("无法打开root入口文件进行识别判定")
	}
	// 打开数据库连接
	db, err := gorm.Open(sqlite.Open(file))
	if err != nil {
		fmt.Println("数据库打开失败：", err)
		return
	}
	min, max = idsMaxMin(getIds(db))
	return
}

// 获取待判断的ID列表
//
//	db	数据库连接
func getIds(db *gorm.DB) []ids {
	table := []string{
		model.AppLog{}.TableName(),
		model.PipeLog{}.TableName(),
		model.QuestLog{}.TableName(),
		model.RuntimeLog{}.TableName(),
	}
	id := []ids{}
	for i := 0; i < len(table); i++ {
		tmp := ids{}
		err := db.Table(table[i]).Select("min(id) as min_id,max(id) as max_id").Find(&tmp).Error
		if err != nil {
			fmt.Println(table[i]+" 日志最小ID查询失败", err)
		}
		id = append(id, tmp)
	}
	return id
}

// 从ids中获取最大id和最小id
//
//	id	待判断比较的ID信息
func idsMaxMin(id []ids) (min, max int64) {
	for i := 0; i < len(id); i++ {
		if id[i].MinId == 0 {
			continue
		}
		if min <= 0 || max <= 0 {
			min, max = id[i].MinId, id[i].MaxId
		}
		if min > id[i].MinId {
			min = id[i].MinId
		}
		if max < id[i].MaxId {
			max = id[i].MaxId
		}
	}
	return
}
